|
(*~\Глагол\Отделы\Поле~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**) ОТДЕЛ Поле;
(*============================================================================*
* НАЗНАЧЕНИЕ: на поле располагаются наделы ввода/вывода текстовых данных
* Поле следит за передачей посылок от клавиатуры и мышки к выбранному наделу.
*============================================================================*)
ИСПОЛЬЗУЕТ
Рамка,
Надел,
Окно ИЗ "..\Обмен\",
Ввод ИЗ "..\Обмен\";
ПОСТ (* встроенные состояния поля (<= 0): *)
сРабота-= 0;
сДалее-=-1;
сОтмена-=-2;
ВИД
Доступ-=ДОСТУП К Вид;
Задача=ЗАДАЧА(поле:Доступ; посылка+:Ввод.Посылка);
Вид-=НАБОР(Рамка.Вид)
наделы :Надел.Доступ; (* связка наделов поля *)
выбранныйНадел:Надел.Доступ; (* надел, выбранный человеком *)
Приём :Задача; (* оставшийся ввод и управление *)
состояние+ :ЦЕЛ; (* м.б. как выше, так и др. *)
КОН;
(* посылки к наделам *)
Отрисовка-=НАБОР(Ввод.Посылка) КОН;
Буквица- =НАБОР(Ввод.Посылка)
буквица+:ЦЕЛ
КОН;
ЗАДАЧА^ ПереместитьВвод(поле:Доступ; дальше:КЛЮЧ);
(* опережающее определение задачи *)
(******************************************************************************)
ЗАДАЧА Рисовать-(поле:Доступ);
(* Перерисовывает все наделы поля *)
ПЕР
надел,первыйНадел:Надел.Доступ;
отрисовка:Отрисовка;
УКАЗ
(* убираем указку *)
Окно.РазмерУказки(0);
(* при необходимости наделы сами нарисуют указку *)
первыйНадел:=поле.наделы;
надел:=первыйНадел;
ПОВТОРЯТЬ
Рамка.Выставить(надел,поле);
надел.Приём(надел,отрисовка);
надел:=надел.следующий
ДО надел = первыйНадел
КОН Рисовать;
(******************************************************************************)
ЗАДАЧА ОкноНаВсёПоле-(поле:Доступ);
(* Выравнивает окно по границе поля *)
УКАЗ
Окно.ИзменитьРазмер(поле.нс+1,поле.пк+1)
КОН ОкноНаВсёПоле;
(******************************************************************************)
ЗАДАЧА СостояниеНаделу-(надел:Надел.Доступ; состояние:ЦЕЛ);
(* изменить состояние надела *)
ПЕР
отрисовка:Отрисовка;
поле:Доступ;
УКАЗ
ЕСЛИ (надел = ПУСТО)
ИЛИ
(надел.состояние = состояние)
ТО
ВОЗВРАТ (* из ЗАДАЧИ *)
КОН;
поле:=надел.поле(Доступ);
ВЫБРАТЬ состояние ИЗ
| Надел.сОбычный:
ЕСЛИ надел.состояние = Надел.сВыбран ТО
(* уберём указку *)
Окно.РазмерУказки(0)
КОН
| Надел.сВыбран:
ЕСЛИ (надел.состояние # Надел.сОтключен)
И (Надел.прВыбираемый В надел.признаки)
И (надел # поле.выбранныйНадел)
ТО
СостояниеНаделу(поле.выбранныйНадел,Надел.сОбычный);
поле.выбранныйНадел:=надел
ИНАЧЕ
ВОЗВРАТ (* из ЗАДАЧИ *)
КОН
| Надел.сОтключен:
ЕСЛИ надел = поле.выбранныйНадел ТО
ПереместитьВвод(поле,ВКЛ)
КОН
ИНАЧЕ
КОН;
надел.состояние:=состояние;
надел.Приём(надел,отрисовка)
КОН СостояниеНаделу;
(******************************************************************************)
ЗАДАЧА ПереместитьВвод(поле:Доступ; дальше:КЛЮЧ);
ПЕР
надел,первыйНадел:Надел.Доступ;
УКАЗ
первыйНадел:=поле.выбранныйНадел;
надел:=первыйНадел;
ПОВТОРЯТЬ
ЕСЛИ дальше ТО
надел:=надел.следующий
ИНАЧЕ
надел:=надел.предыдущий
КОН;
ЕСЛИ (Надел.прВыбираемый В надел.признаки)
И (надел.состояние # Надел.сОтключен)
ТО
СостояниеНаделу(надел,Надел.сВыбран);
ВОЗВРАТ (* из ЗАДАЧИ *)
КОН
ДО надел = первыйНадел
КОН ПереместитьВвод;
(******************************************************************************)
ЗАДАЧА Проверить-(поле:Доступ);
ПЕР
надел,выбранныйНадел,первыйНадел:Надел.Доступ;
родп:ЦЕЛ; (* род посылки *)
(* посылки *)
отКлавиш:Ввод.ОтКлавиш;
отМышки:Ввод.ОтМышки;
буквица:Буквица;
УКАЗ
родп:=Окно.Опрос(отКлавиш,отМышки);
выбранныйНадел:=поле.выбранныйНадел;
ЕСЛИ родп = Ввод.клавиши ТО (* пришла посылка от клавиатуры *)
(* сначало её обрабатывает надел с текущим вводом *)
ЕСЛИ выбранныйНадел # ПУСТО ТО
выбранныйНадел.Приём(выбранныйНадел,отКлавиш);
ЕСЛИ отКлавиш.код = 0 ТО ВОЗВРАТ (* из ЗАДАЧИ *) КОН;
КОН;
(* остаток обрабатывает пользователь поля *)
поле.Приём(поле,отКлавиш);
ЕСЛИ отКлавиш.код = 0 ТО ВОЗВРАТ (* из ЗАДАЧИ *) КОН;
(* опрашиваем буквицы наделов *)
буквица.буквица:=отКлавиш.код;
первыйНадел:=поле.наделы;
надел:=первыйНадел;
КОЛЬЦО
ЕСЛИ НЕ (Надел.прГлухой В надел.признаки)
И (надел.состояние # Надел.сОтключен)
ТО
надел.Приём(надел,буквица);
ЕСЛИ буквица.буквица = 0 ТО (* надел отозвался *)
СостояниеНаделу(надел,Надел.сВыбран);
ВОЗВРАТ (* из ЗАДАЧИ *)
КОН
КОН;
надел:=надел.следующий;
ЕСЛИ надел = первыйНадел ТО
ВЫХОД (* из КОЛЬЦА *)
КОН
КОН;
(* под конец проверяем смену ввода *)
ЕСЛИ выбранныйНадел # ПУСТО ТО
ЕСЛИ отКлавиш.код = 9 ТО (* по Tab *)
ПереместитьВвод(поле,НЕ отКлавиш.упрШифт)
АЕСЛИ НЕ (отКлавиш.упрШифт ИЛИ отКлавиш.упрКонтр) ТО
ВЫБРАТЬ отКлавиш.код ИЗ (* по стрелкам *)
(* <- ^*) | 25H,26H: ПереместитьВвод(поле,ОТКЛ)
(* -> V*) | 27H,28H: ПереместитьВвод(поле,ВКЛ)
ИНАЧЕ
КОН
КОН
КОН
АЕСЛИ родп = Ввод.мышка ТО (* пришла посылка от мышки *)
ЕСЛИ Ввод.прокрут В отМышки.события ТО (* прокрут колеса *)
ЕСЛИ выбранныйНадел # ПУСТО ТО
выбранныйНадел.Приём(выбранныйНадел,отМышки)
КОН
ИНАЧЕ (* нажатие и отпускание кнопки *)
ЕСЛИ (отМышки.к < поле.лк)
ИЛИ (отМышки.к > поле.пк)
ИЛИ (отМышки.с < поле.вс)
ИЛИ (отМышки.с > поле.нс)
ТО (* мимо поля *)
ВОЗВРАТ (* из ЗАДАЧИ *)
КОН;
(* ищем надел в который попала мышка *)
ЕСЛИ выбранныйНадел # ПУСТО ТО (* скорее всего она попала в выбранный *)
первыйНадел:=выбранныйНадел
ИНАЧЕ
первыйНадел:=поле.наделы
КОН;
надел:=первыйНадел;
КОЛЬЦО
ЕСЛИ НЕ (Надел.прГлухой В надел.признаки)
И (надел.состояние # Надел.сОтключен)
И (отМышки.к >= надел.лк) И (отМышки.к <= надел.пк)
И (отМышки.с >= надел.вс) И (отМышки.с <= надел.нс)
ТО (* попалась *)
ЕСЛИ выбранныйНадел # ПУСТО ТО
СостояниеНаделу(надел,Надел.сВыбран)
КОН;
(* преобразуем к местным координатам *)
УМЕНЬШИТЬ(отМышки.к,надел.лк);
УМЕНЬШИТЬ(отМышки.с,надел.вс);
ЕСЛИ (отМышки.события = {})
И (отМышки.кнопки = {})
ТО (* отпущена кнопка *)
надел.Приём(надел,отМышки)
КОН;
(* поиск прекратить *)
ВЫХОД (* из КОЛЬЦА *)
КОН;
надел:=надел.следующий;
ЕСЛИ надел = первыйНадел ТО ВЫХОД (* из КОЛЬЦА *) КОН
КОН
КОН;
ЕСЛИ НЕ отМышки.отработана ТО (* что осталось, обрабатывает пользователь поля *)
поле.Приём(поле,отМышки)
КОН
АЕСЛИ родп = Ввод.закрыт ТО
поле.состояние:=сОтмена
КОН
КОН Проверить;
(******************************************************************************)
ЗАДАЧА ДобавитьНадел-(поле:Доступ; надел:Надел.Доступ);
(* Добавляет <надел> в <поле> *)
УКАЗ
(* добавляем в связку *)
Надел.Добавить(поле.наделы,надел);
(* обратная связь для надела *)
надел.поле:=поле;
(* поиск первого возможного надела с вводом *)
ЕСЛИ (поле.выбранныйНадел = ПУСТО)
И (надел.состояние # Надел.сОтключен)
И (Надел.прВыбираемый В надел.признаки)
ТО
надел.состояние:=Надел.сВыбран;
поле.выбранныйНадел:=надел
КОН;
КОН ДобавитьНадел;
(******************************************************************************)
ЗАДАЧА Создать-(верх,лево,строк,колонок:ЦЕЛ;
окружение:Доступ;
середина:КЛЮЧ;
Приём:Задача):Доступ;
ПЕР
поле:Доступ;
УКАЗ
СОЗДАТЬ(поле);
ЕСЛИ окружение = ПУСТО ТО
(* окружением является всё окно экрана *)
СОЗДАТЬ(окружение);
Рамка.Подготовить(окружение,0,0,строк,колонок)
КОН;
ЕСЛИ середина ТО
(* помещаем поле в середину окружения *)
верх:=(окружение.нс-окружение.вс-строк+1) ДЕЛИТЬ 2;
лево:=(окружение.пк-окружение.лк-колонок+1) ДЕЛИТЬ 2
КОН;
Рамка.Подготовить(поле,верх,лево,строк,колонок);
Рамка.Выставить(поле,окружение);
поле.Приём:=Приём;
ВОЗВРАТ поле (* из ЗАДАЧИ *)
КОН Создать;
КОН Поле.
|
|